#include <stdio.h>
//#include <string.h> // для проверки работы ориг.функций

void s21_strcpy(char *, char *);
/* Вычисляет длину строки str, не включая завершающий нулевой символ. */
size_t s21_strlen(const char *str);

/* Вычисляет длину начального сегмента str1, который
 * полностью состоит из символов, не входящих в str2. */
size_t s21_strcspn(const char *str1, const char *str2);

/* Находит первый символ в строке str1, который соответствует любому символу,
 * указанному в str2. */
char *s21_strpbrk(const char *str1, const char *str2);
/* Поиск последнего вхождения символа в строку. */
char *s21_strrchr(const char *str, int ch);
/* Поиск первого вхождения строки 2 в строку 1. */
char *s21_strstr(char *str, char *sep);
/* Разбиение строки на части по указанному разделителю. */
char *s21_strtok(const char *str, const char *delim);

int main() {
  char in[] = "Very cool school 21 yar";
  char instr[] = "Very cool school 21 yar";
  char out[25] = {0};

  char sep[] = "cool";
  char *resultat;

  /* str cpy */
  s21_strcpy(out, in);
  puts(out);

  /* str len */
  printf("Dlina stroki %ld\n", s21_strlen(in));

  /* str pbrk */
  resultat = s21_strpbrk(in, "21");
  if (NULL != resultat)
    printf("s21_strpbrk %ld\n", resultat - in + 1);
  else
    puts("strpbrk NULL");

  /* str rchr */
  resultat = s21_strrchr(in, 'l');
  if (NULL != resultat)
    printf("s21_strrchr %ld\n", resultat - in + 1);
  else
    puts("strrchr NULL");

  /* str str */
  resultat = s21_strstr(instr, sep);
  if (NULL != resultat)
    printf("s21_strstr %ld\n", resultat - instr + 1);
  else
    puts("strstr NULL");

  /* str tok */
  char instrtok[] = "Very,,cool,school;21;yar,msk.sity";
  printf("s21_strtok tokens\n");
  resultat = s21_strtok(instrtok, ",;");
  while (resultat != NULL) {
    printf("\t%s\n", resultat);
    resultat = s21_strtok(NULL, ",.;");
  }

  return 0;
}

/* 4-е функции --------------------------------------- */
char *s21_strpbrk(const char *str1, const char *str2) {
  char *res = NULL;
  int flag = 0;
  while (*str1 != '\0' && !flag) {
    int count = 0;
    while (*str2 != '\0') {
      ++count;
      if (*str1 == *str2) {
        flag = 1;
        ++str2;
        break;
      }
      ++str2;
    }
    str2 -= count;
    res = (char *)str1;
    ++str1;
  }
  return res;
}

char *s21_strrchr(const char *str, int ch) {
  char *res = NULL;
  while (*str != '\0') {
    if (*str == ch) res = (char *)str;
    ++str;
  }
  return res;
}

char *s21_strstr(char *str, char *sep) {
  char *res = NULL;
  char *start = NULL;
  size_t len_sep = 0;
  len_sep = s21_strlen(sep);
  size_t count = 0;

  if (len_sep != 0) {
    while (*str++ != '\0') {
      if (*str == *sep) {
        start = str;
        for (char *p = sep; p - sep < (long)len_sep; ++p) {
          if (*str++ == *sep++) {
            ++count;
          } else {
            break;
          }
        }
      }
      if (count == len_sep)
        res = start;
      else
        res = NULL;
    }
  } else
    res = str;

  return res;
}

char *s21_strtok(const char *str, const char *delim) {
  static char *tmp_str = NULL;
  static int flag_end_str = 0;
  char *start_str = NULL;
  char *res = NULL;
  size_t len_str = 0;

  if (str != NULL) {
    tmp_str = (char *)str;
    flag_end_str = 0;
  }

  if (!flag_end_str) {
    while (1) {
      len_str = s21_strcspn(tmp_str, delim);
      if (len_str != 0) break;  // если strcspn выдаёт 0, значит в начале
      tmp_str++;  // строке, есть ещё делитель, то двигаем указатель
    }
    start_str = tmp_str;     // сохраняем начало строки
    tmp_str += len_str;      // сдвигаем указатель
    if (*tmp_str != '\0') {  // если ещё не конец строки, то
      *tmp_str = '\0';  // меняем символ на конец строки '\0'
      tmp_str++;  // и сдвигаем указатель за символ '\0'
    } else
      flag_end_str = 1;  // иначе устанавливаем флаг, что вся строка закончилась
    res = start_str;  // возвращаем указатель начала строки
  }

  return res;
}
/* ------------------------------------------------- */

void s21_strcpy(char *out, char *in) {
  while ((*out++ = *in++) != '\0') {
    ;
  }
}

size_t s21_strlen(const char *str) {
  size_t count = 0;
  while (*str++ != '\0') {
    ++count;
  }
  return count;
}

/* Мишина функция, немного доделал (не ловила конец файла) */
/* add '=' в строке -> for (i = 0; i <= size_str1; i++) { */
/* add || str1[i] == '\0' в строке -> if (str1[i] == str2[j] */
size_t s21_strcspn(const char *str1, const char *str2) {
  size_t first_arrival = 0;
  int size_str1 = s21_strlen(str1);
  int size_str2 = s21_strlen(str2);
  int flag = 0;
  if (size_str2 != 0) {
    int i, j;
    for (i = 0; i <= size_str1; i++) {
      for (j = 0; j < size_str2; j++) {
        if (str1[i] == str2[j] || str1[i] == '\0') {
          first_arrival = (size_t)i;
          flag = -1;
          break;
        }
      }
      if (flag == -1) {
        break;
      }
    }

  } else {
    first_arrival = (size_t)size_str1;
  }
  return first_arrival;
}
/* ------------------------------------------------------- */